//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS IoTDeviceAdvisor service.
///
/// Amazon Web Services IoT Core Device Advisor is a cloud-based, fully managed test capability for validating IoT devices during device software development. Device Advisor provides pre-built tests that you can use to validate IoT devices for reliable and secure connectivity with Amazon Web Services IoT Core before deploying devices to production. By using Device Advisor, you can confirm that your devices can connect to Amazon Web Services IoT Core, follow security best practices and, if applicable, receive software updates from IoT Device Management. You can also download signed qualification reports to submit to the Amazon Web Services Partner Network to get your device qualified for the Amazon Web Services Partner Device Catalog without the need to send your device in and wait for it to be tested.
public struct IoTDeviceAdvisor: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the IoTDeviceAdvisor client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            serviceName: "IoTDeviceAdvisor",
            serviceIdentifier: "api.iotdeviceadvisor",
            signingName: "iotdeviceadvisor",
            serviceProtocol: .restjson,
            apiVersion: "2020-09-18",
            endpoint: endpoint,
            serviceEndpoints: Self.serviceEndpoints,
            errorType: IoTDeviceAdvisorErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }


    /// custom endpoints for regions
    static var serviceEndpoints: [String: String] {[
        "ap-northeast-1": "api.iotdeviceadvisor.ap-northeast-1.amazonaws.com",
        "eu-west-1": "api.iotdeviceadvisor.eu-west-1.amazonaws.com",
        "us-east-1": "api.iotdeviceadvisor.us-east-1.amazonaws.com",
        "us-west-2": "api.iotdeviceadvisor.us-west-2.amazonaws.com"
    ]}



    // MARK: API Calls

    /// Creates a Device Advisor test suite. Requires permission to access the CreateSuiteDefinition action.
    @Sendable
    @inlinable
    public func createSuiteDefinition(_ input: CreateSuiteDefinitionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateSuiteDefinitionResponse {
        try await self.client.execute(
            operation: "CreateSuiteDefinition", 
            path: "/suiteDefinitions", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a Device Advisor test suite. Requires permission to access the CreateSuiteDefinition action.
    ///
    /// Parameters:
    ///   - clientToken: The client token for the test suite definition creation.  This token is used for tracking test suite definition creation  using retries and obtaining its status. This parameter is optional.
    ///   - suiteDefinitionConfiguration: Creates a Device Advisor test suite with suite definition configuration.
    ///   - tags: The tags to be attached to the suite definition.
    ///   - logger: Logger use during operation
    @inlinable
    public func createSuiteDefinition(
        clientToken: String? = CreateSuiteDefinitionRequest.idempotencyToken(),
        suiteDefinitionConfiguration: SuiteDefinitionConfiguration? = nil,
        tags: [String: String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateSuiteDefinitionResponse {
        let input = CreateSuiteDefinitionRequest(
            clientToken: clientToken, 
            suiteDefinitionConfiguration: suiteDefinitionConfiguration, 
            tags: tags
        )
        return try await self.createSuiteDefinition(input, logger: logger)
    }

    /// Deletes a Device Advisor test suite. Requires permission to access the DeleteSuiteDefinition action.
    @Sendable
    @inlinable
    public func deleteSuiteDefinition(_ input: DeleteSuiteDefinitionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteSuiteDefinitionResponse {
        try await self.client.execute(
            operation: "DeleteSuiteDefinition", 
            path: "/suiteDefinitions/{suiteDefinitionId}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a Device Advisor test suite. Requires permission to access the DeleteSuiteDefinition action.
    ///
    /// Parameters:
    ///   - suiteDefinitionId: Suite definition ID of the test suite to be deleted.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteSuiteDefinition(
        suiteDefinitionId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteSuiteDefinitionResponse {
        let input = DeleteSuiteDefinitionRequest(
            suiteDefinitionId: suiteDefinitionId
        )
        return try await self.deleteSuiteDefinition(input, logger: logger)
    }

    /// Gets information about an Device Advisor endpoint.
    @Sendable
    @inlinable
    public func getEndpoint(_ input: GetEndpointRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetEndpointResponse {
        try await self.client.execute(
            operation: "GetEndpoint", 
            path: "/endpoint", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets information about an Device Advisor endpoint.
    ///
    /// Parameters:
    ///   - authenticationMethod: The authentication method used during the device connection.
    ///   - certificateArn: The certificate ARN of the device. This is an optional parameter.
    ///   - deviceRoleArn: The device role ARN of the device. This is an optional parameter.
    ///   - thingArn: The thing ARN of the device. This is an optional parameter.
    ///   - logger: Logger use during operation
    @inlinable
    public func getEndpoint(
        authenticationMethod: AuthenticationMethod? = nil,
        certificateArn: String? = nil,
        deviceRoleArn: String? = nil,
        thingArn: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetEndpointResponse {
        let input = GetEndpointRequest(
            authenticationMethod: authenticationMethod, 
            certificateArn: certificateArn, 
            deviceRoleArn: deviceRoleArn, 
            thingArn: thingArn
        )
        return try await self.getEndpoint(input, logger: logger)
    }

    /// Gets information about a Device Advisor test suite. Requires permission to access the GetSuiteDefinition action.
    @Sendable
    @inlinable
    public func getSuiteDefinition(_ input: GetSuiteDefinitionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetSuiteDefinitionResponse {
        try await self.client.execute(
            operation: "GetSuiteDefinition", 
            path: "/suiteDefinitions/{suiteDefinitionId}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets information about a Device Advisor test suite. Requires permission to access the GetSuiteDefinition action.
    ///
    /// Parameters:
    ///   - suiteDefinitionId: Suite definition ID of the test suite to get.
    ///   - suiteDefinitionVersion: Suite definition version of the test suite to get.
    ///   - logger: Logger use during operation
    @inlinable
    public func getSuiteDefinition(
        suiteDefinitionId: String,
        suiteDefinitionVersion: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetSuiteDefinitionResponse {
        let input = GetSuiteDefinitionRequest(
            suiteDefinitionId: suiteDefinitionId, 
            suiteDefinitionVersion: suiteDefinitionVersion
        )
        return try await self.getSuiteDefinition(input, logger: logger)
    }

    /// Gets information about a Device Advisor test suite run. Requires permission to access the GetSuiteRun action.
    @Sendable
    @inlinable
    public func getSuiteRun(_ input: GetSuiteRunRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetSuiteRunResponse {
        try await self.client.execute(
            operation: "GetSuiteRun", 
            path: "/suiteDefinitions/{suiteDefinitionId}/suiteRuns/{suiteRunId}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets information about a Device Advisor test suite run. Requires permission to access the GetSuiteRun action.
    ///
    /// Parameters:
    ///   - suiteDefinitionId: Suite definition ID for the test suite run.
    ///   - suiteRunId: Suite run ID for the test suite run.
    ///   - logger: Logger use during operation
    @inlinable
    public func getSuiteRun(
        suiteDefinitionId: String,
        suiteRunId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetSuiteRunResponse {
        let input = GetSuiteRunRequest(
            suiteDefinitionId: suiteDefinitionId, 
            suiteRunId: suiteRunId
        )
        return try await self.getSuiteRun(input, logger: logger)
    }

    /// Gets a report download link for a successful Device Advisor qualifying test suite run. Requires permission to access the GetSuiteRunReport action.
    @Sendable
    @inlinable
    public func getSuiteRunReport(_ input: GetSuiteRunReportRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetSuiteRunReportResponse {
        try await self.client.execute(
            operation: "GetSuiteRunReport", 
            path: "/suiteDefinitions/{suiteDefinitionId}/suiteRuns/{suiteRunId}/report", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets a report download link for a successful Device Advisor qualifying test suite run. Requires permission to access the GetSuiteRunReport action.
    ///
    /// Parameters:
    ///   - suiteDefinitionId: Suite definition ID of the test suite.
    ///   - suiteRunId: Suite run ID of the test suite run.
    ///   - logger: Logger use during operation
    @inlinable
    public func getSuiteRunReport(
        suiteDefinitionId: String,
        suiteRunId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetSuiteRunReportResponse {
        let input = GetSuiteRunReportRequest(
            suiteDefinitionId: suiteDefinitionId, 
            suiteRunId: suiteRunId
        )
        return try await self.getSuiteRunReport(input, logger: logger)
    }

    /// Lists the Device Advisor test suites you have created. Requires permission to access the ListSuiteDefinitions action.
    @Sendable
    @inlinable
    public func listSuiteDefinitions(_ input: ListSuiteDefinitionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListSuiteDefinitionsResponse {
        try await self.client.execute(
            operation: "ListSuiteDefinitions", 
            path: "/suiteDefinitions", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the Device Advisor test suites you have created. Requires permission to access the ListSuiteDefinitions action.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results to return at once.
    ///   - nextToken: A token used to get the next set of results.
    ///   - logger: Logger use during operation
    @inlinable
    public func listSuiteDefinitions(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListSuiteDefinitionsResponse {
        let input = ListSuiteDefinitionsRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listSuiteDefinitions(input, logger: logger)
    }

    /// Lists runs of the specified Device Advisor test suite. You can list all runs of the test suite, or the runs of a specific version of the test suite. Requires permission to access the ListSuiteRuns action.
    @Sendable
    @inlinable
    public func listSuiteRuns(_ input: ListSuiteRunsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListSuiteRunsResponse {
        try await self.client.execute(
            operation: "ListSuiteRuns", 
            path: "/suiteRuns", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists runs of the specified Device Advisor test suite. You can list all runs of the test suite, or the runs of a specific version of the test suite. Requires permission to access the ListSuiteRuns action.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results to return at once.
    ///   - nextToken: A token to retrieve the next set of results.
    ///   - suiteDefinitionId: Lists the test suite runs of the specified test suite based on suite definition ID.
    ///   - suiteDefinitionVersion: Must be passed along with suiteDefinitionId. Lists the test suite runs of the specified test suite based on suite definition version.
    ///   - logger: Logger use during operation
    @inlinable
    public func listSuiteRuns(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        suiteDefinitionId: String? = nil,
        suiteDefinitionVersion: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListSuiteRunsResponse {
        let input = ListSuiteRunsRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            suiteDefinitionId: suiteDefinitionId, 
            suiteDefinitionVersion: suiteDefinitionVersion
        )
        return try await self.listSuiteRuns(input, logger: logger)
    }

    /// Lists the tags attached to an IoT Device Advisor resource. Requires permission to access the ListTagsForResource action.
    @Sendable
    @inlinable
    public func listTagsForResource(_ input: ListTagsForResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTagsForResourceResponse {
        try await self.client.execute(
            operation: "ListTagsForResource", 
            path: "/tags/{resourceArn}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the tags attached to an IoT Device Advisor resource. Requires permission to access the ListTagsForResource action.
    ///
    /// Parameters:
    ///   - resourceArn: The resource ARN of the IoT Device Advisor resource. This can be SuiteDefinition ARN or SuiteRun ARN.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTagsForResource(
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTagsForResourceResponse {
        let input = ListTagsForResourceRequest(
            resourceArn: resourceArn
        )
        return try await self.listTagsForResource(input, logger: logger)
    }

    /// Starts a Device Advisor test suite run. Requires permission to access the StartSuiteRun action.
    @Sendable
    @inlinable
    public func startSuiteRun(_ input: StartSuiteRunRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StartSuiteRunResponse {
        try await self.client.execute(
            operation: "StartSuiteRun", 
            path: "/suiteDefinitions/{suiteDefinitionId}/suiteRuns", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Starts a Device Advisor test suite run. Requires permission to access the StartSuiteRun action.
    ///
    /// Parameters:
    ///   - suiteDefinitionId: Suite definition ID of the test suite.
    ///   - suiteDefinitionVersion: Suite definition version of the test suite.
    ///   - suiteRunConfiguration: Suite run configuration.
    ///   - tags: The tags to be attached to the suite run.
    ///   - logger: Logger use during operation
    @inlinable
    public func startSuiteRun(
        suiteDefinitionId: String,
        suiteDefinitionVersion: String? = nil,
        suiteRunConfiguration: SuiteRunConfiguration? = nil,
        tags: [String: String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartSuiteRunResponse {
        let input = StartSuiteRunRequest(
            suiteDefinitionId: suiteDefinitionId, 
            suiteDefinitionVersion: suiteDefinitionVersion, 
            suiteRunConfiguration: suiteRunConfiguration, 
            tags: tags
        )
        return try await self.startSuiteRun(input, logger: logger)
    }

    /// Stops a Device Advisor test suite run that is currently running. Requires permission to access the StopSuiteRun action.
    @Sendable
    @inlinable
    public func stopSuiteRun(_ input: StopSuiteRunRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StopSuiteRunResponse {
        try await self.client.execute(
            operation: "StopSuiteRun", 
            path: "/suiteDefinitions/{suiteDefinitionId}/suiteRuns/{suiteRunId}/stop", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Stops a Device Advisor test suite run that is currently running. Requires permission to access the StopSuiteRun action.
    ///
    /// Parameters:
    ///   - suiteDefinitionId: Suite definition ID of the test suite run to be stopped.
    ///   - suiteRunId: Suite run ID of the test suite run to be stopped.
    ///   - logger: Logger use during operation
    @inlinable
    public func stopSuiteRun(
        suiteDefinitionId: String,
        suiteRunId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StopSuiteRunResponse {
        let input = StopSuiteRunRequest(
            suiteDefinitionId: suiteDefinitionId, 
            suiteRunId: suiteRunId
        )
        return try await self.stopSuiteRun(input, logger: logger)
    }

    /// Adds to and modifies existing tags of an IoT Device Advisor resource. Requires permission to access the TagResource action.
    @Sendable
    @inlinable
    public func tagResource(_ input: TagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> TagResourceResponse {
        try await self.client.execute(
            operation: "TagResource", 
            path: "/tags/{resourceArn}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Adds to and modifies existing tags of an IoT Device Advisor resource. Requires permission to access the TagResource action.
    ///
    /// Parameters:
    ///   - resourceArn: The resource ARN of an IoT Device Advisor resource. This can be SuiteDefinition ARN or SuiteRun ARN.
    ///   - tags: The tags to be attached to the IoT Device Advisor resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func tagResource(
        resourceArn: String,
        tags: [String: String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> TagResourceResponse {
        let input = TagResourceRequest(
            resourceArn: resourceArn, 
            tags: tags
        )
        return try await self.tagResource(input, logger: logger)
    }

    /// Removes tags from an IoT Device Advisor resource. Requires permission to access the UntagResource action.
    @Sendable
    @inlinable
    public func untagResource(_ input: UntagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UntagResourceResponse {
        try await self.client.execute(
            operation: "UntagResource", 
            path: "/tags/{resourceArn}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes tags from an IoT Device Advisor resource. Requires permission to access the UntagResource action.
    ///
    /// Parameters:
    ///   - resourceArn: The resource ARN of an IoT Device Advisor resource. This can be SuiteDefinition ARN or SuiteRun ARN.
    ///   - tagKeys: List of tag keys to remove from the IoT Device Advisor resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func untagResource(
        resourceArn: String,
        tagKeys: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UntagResourceResponse {
        let input = UntagResourceRequest(
            resourceArn: resourceArn, 
            tagKeys: tagKeys
        )
        return try await self.untagResource(input, logger: logger)
    }

    /// Updates a Device Advisor test suite. Requires permission to access the UpdateSuiteDefinition action.
    @Sendable
    @inlinable
    public func updateSuiteDefinition(_ input: UpdateSuiteDefinitionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateSuiteDefinitionResponse {
        try await self.client.execute(
            operation: "UpdateSuiteDefinition", 
            path: "/suiteDefinitions/{suiteDefinitionId}", 
            httpMethod: .PATCH, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a Device Advisor test suite. Requires permission to access the UpdateSuiteDefinition action.
    ///
    /// Parameters:
    ///   - suiteDefinitionConfiguration: Updates a Device Advisor test suite with suite definition configuration.
    ///   - suiteDefinitionId: Suite definition ID of the test suite to be updated.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateSuiteDefinition(
        suiteDefinitionConfiguration: SuiteDefinitionConfiguration? = nil,
        suiteDefinitionId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateSuiteDefinitionResponse {
        let input = UpdateSuiteDefinitionRequest(
            suiteDefinitionConfiguration: suiteDefinitionConfiguration, 
            suiteDefinitionId: suiteDefinitionId
        )
        return try await self.updateSuiteDefinition(input, logger: logger)
    }
}

extension IoTDeviceAdvisor {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: IoTDeviceAdvisor, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension IoTDeviceAdvisor {
    /// Return PaginatorSequence for operation ``listSuiteDefinitions(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listSuiteDefinitionsPaginator(
        _ input: ListSuiteDefinitionsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListSuiteDefinitionsRequest, ListSuiteDefinitionsResponse> {
        return .init(
            input: input,
            command: self.listSuiteDefinitions,
            inputKey: \ListSuiteDefinitionsRequest.nextToken,
            outputKey: \ListSuiteDefinitionsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listSuiteDefinitions(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results to return at once.
    ///   - logger: Logger used for logging
    @inlinable
    public func listSuiteDefinitionsPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListSuiteDefinitionsRequest, ListSuiteDefinitionsResponse> {
        let input = ListSuiteDefinitionsRequest(
            maxResults: maxResults
        )
        return self.listSuiteDefinitionsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listSuiteRuns(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listSuiteRunsPaginator(
        _ input: ListSuiteRunsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListSuiteRunsRequest, ListSuiteRunsResponse> {
        return .init(
            input: input,
            command: self.listSuiteRuns,
            inputKey: \ListSuiteRunsRequest.nextToken,
            outputKey: \ListSuiteRunsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listSuiteRuns(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results to return at once.
    ///   - suiteDefinitionId: Lists the test suite runs of the specified test suite based on suite definition ID.
    ///   - suiteDefinitionVersion: Must be passed along with suiteDefinitionId. Lists the test suite runs of the specified test suite based on suite definition version.
    ///   - logger: Logger used for logging
    @inlinable
    public func listSuiteRunsPaginator(
        maxResults: Int? = nil,
        suiteDefinitionId: String? = nil,
        suiteDefinitionVersion: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListSuiteRunsRequest, ListSuiteRunsResponse> {
        let input = ListSuiteRunsRequest(
            maxResults: maxResults, 
            suiteDefinitionId: suiteDefinitionId, 
            suiteDefinitionVersion: suiteDefinitionVersion
        )
        return self.listSuiteRunsPaginator(input, logger: logger)
    }
}

extension IoTDeviceAdvisor.ListSuiteDefinitionsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> IoTDeviceAdvisor.ListSuiteDefinitionsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension IoTDeviceAdvisor.ListSuiteRunsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> IoTDeviceAdvisor.ListSuiteRunsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            suiteDefinitionId: self.suiteDefinitionId,
            suiteDefinitionVersion: self.suiteDefinitionVersion
        )
    }
}
